package com.fuze.energy.scheduling;

import com.fuze.energy.config.GlobalConstance;
import com.fuze.energy.domain.entity.MonitoringData;
import com.fuze.energy.mapper.MonitoringDataMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * @author sepc_
 * @date 2/25/2021 16:59
 * 定时任务：定时从Redis中获取最新的数据并持久化保存到数据库中
 * 其实这里更好的做法是使用MQ来解决，更适配开发场景，但是服务器没有安装，所以就直接使用Redis替代了一下
 *
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class DataPersistenceTask {

    final StringRedisTemplate stringRedisTemplate;

    final MonitoringDataMapper monitoringDataMapper;

    /**
     * 定时任务获取Redis中存储的采集数据并入库
     * 这里是10秒存储一次，5s内的数据变化并不大
     * 使用了自定义的线程池
     */
    @Async(value = "taskExecutor")
    // @Scheduled(cron = "${corn.persistence}")
    public void persistence() {
        log.info("开始执行数据持久化...");
        String mlx = stringRedisTemplate.opsForValue().get(GlobalConstance.MLX_KEY);
        if (!StringUtils.isNotBlank(mlx)) {
            mlx = "0.0";
        }
        String pc0 = stringRedisTemplate.opsForValue().get(GlobalConstance.PC0_KEY);
        if (!StringUtils.isNotBlank(pc0)) {
            pc0 = "0.0";
        }
        String pc1 = stringRedisTemplate.opsForValue().get(GlobalConstance.PC1_KEY);
        if (!StringUtils.isNotBlank(pc1)) {
            pc1 = "0.0";
        }
        String humidity = stringRedisTemplate.opsForValue().get(GlobalConstance.HUMIDITY_KEY);
        if (!StringUtils.isNotBlank(humidity)) {
            humidity = "0.0";
        }
        String temperature = stringRedisTemplate.opsForValue().get(GlobalConstance.TEMPERATURE_KEY);
        if (!StringUtils.isNotBlank(temperature)) {
            temperature = "0.0";
        }
        MonitoringData data = new MonitoringData();
        data.setMainboardid("1");
        data.setDate(new Date());
        data.setTemperature(Double.valueOf(temperature));
        data.setHumidity(Double.valueOf(humidity));
        data.setInfraredThermometry(Double.valueOf(mlx));
        data.setSmokeDenstiy(0);
        data.setRmuName("环网柜1");
        // TODO: 2022-02-10 有两个数据不确定，所以没有存入数据库，后面确定了这两个数据是需要加入进来的 
        int insert = monitoringDataMapper.insert(data);
        if (insert == 1) {
            log.info("数据插入成功！");
        } else {
            log.error("数据插入失败！");
        }
        log.info("结束一轮数据持久化操作...");
    }

}
